package com.order.manager.controller.Shop;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.order.manager.Model.OrderInfo;
import com.order.manager.Model.ShopInfo;
import com.order.manager.Model.UserInfo;
//提供报错信息返回
import com.order.manager.Model.other.RestBean;

import com.order.manager.Model.other.ShopShow;
import com.order.manager.service.impl.OrderInfoServiceImpl;
import com.order.manager.service.impl.ShopInfoServiceImpl;
import com.order.manager.service.impl.UserInfoServiceImpl;
import com.order.manager.util.JwtUtil;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * 店铺管理控制器
 * 处理店铺创建、查询、状态更新及统计等业务逻辑
 */
@RestController
@RequestMapping("/api/shop")
public class ShopController {

    // 注入店铺信息服务，用于操作店铺基础信息
    @Resource
    ShopInfoServiceImpl shopInfoService;

    // 注入用户信息服务，用于关联用户与店铺
    @Resource
    UserInfoServiceImpl userInfoService;

    // 注入JWT工具类，用于解析用户身份令牌
    @Resource
    JwtUtil jwtUtil;

    // 注入订单信息服务，用于订单统计
    @Resource
    OrderInfoServiceImpl orderInfoService;

    /**
     * 用户申请创建店铺（需已注册为商户）
     * @param request HTTP请求对象，用于获取用户身份
     * @return 创建结果响应
     */
    @RequestMapping("/insert")
    public RestBean applyShop(HttpServletRequest request) {
        // 从JWT中解析用户ID
        String userId = jwtUtil.getJwtUsername(request);
        // 查询用户信息
        UserInfo userInfo = userInfoService.getById(userId);
        // 校验用户是否存在且状态正常
        if (userInfo == null || userInfo.getState() != 1) {
            return RestBean.failure(403, "用户异常");
        }

        // 创建店铺信息实体
        ShopInfo shopInfo = new ShopInfo();
        shopInfo.setShopName(userInfo.getName() + "的店铺"); // 默认店铺名
        shopInfo.setShopId(UUID.randomUUID().toString());   // 生成唯一店铺ID
        shopInfo.setShopState(0);                            // 设置初始状态为待审核
        shopInfo.setInputTime(new Date());                   // 设置创建时间
        shopInfo.setShopMasterId(userInfo.getUserId());      // 关联店主ID
        shopInfo.setUpdateTime(new Date());                  // 设置更新时间

        // 保存店铺信息，返回操作结果
        return shopInfoService.save(shopInfo) ? RestBean.success(shopInfo) : RestBean.failure(500, "server error");
    }

    /**
     * 更新店铺信息
     * @param shopInfo 包含更新内容的店铺信息实体
     * @return 更新结果响应
     */
    @RequestMapping("/update")
    public RestBean update(@RequestBody ShopInfo shopInfo) {
        // 更新时间戳
        shopInfo.setUpdateTime(new Date());
        // 更新店铺信息，返回操作结果
        return shopInfoService.updateById(shopInfo) ? RestBean.success(shopInfo) : RestBean.failure(500, "server error");
    }
    /**
     * 分页查询店铺列表（支持按名称模糊搜索）
     * @param page 当前页码
     * @param item 每页显示数量
     * @param shopName 店铺名称（模糊搜索条件）
     * @return 店铺列表响应
     */
    @RequestMapping("/select/{page}/{item}")
    public RestBean queryShop(@PathVariable int page, @PathVariable int item, String shopName) {
        // 调用服务层分页查询方法，返回店铺列表
        return RestBean.success(shopInfoService.queryByShopName(page, item, shopName));
    }

    /**
     * 查询用户收藏的店铺列表（分页）
     * @param page 当前页码
     * @param item 每页显示数量
     * @param shopName 店铺名称（模糊搜索条件）
     * @param request HTTP请求对象，用于获取用户身份
     * @return 收藏店铺列表响应
     */
    @RequestMapping("/select/collect/{page}/{item}")
    public RestBean queryByUserCollect(@PathVariable int page, @PathVariable int item, String shopName, HttpServletRequest request) {
        // 从JWT中解析用户ID
        String uuid = jwtUtil.getJwtUsername(request);
        // 调用服务层方法查询用户收藏的店铺列表
        return RestBean.success(shopInfoService.queryByShopAndUserCollect(page, item, shopName, uuid));
    }

    /**
     * 更新店铺状态
     * @param shopId 店铺ID
     * @param state 新状态（0:待审核 1:审核通过 2:暂停营业 3:正常营业 -1:已关闭）
     * @return 更新结果响应
     */
    @RequestMapping("/update/state/{shopId}/{state}")
    public RestBean updateState(@PathVariable String shopId, @PathVariable int state) {
        // 根据店铺ID查询店铺信息
        ShopInfo shopInfo = shopInfoService.getById(shopId);
        if (shopInfo == null) {
            return RestBean.failure(403, "该商店不存在");
        }

        // 校验状态码有效性
        if (state == 1 || state == 2 || state == 3 || state == -1 || state == 0) {
            shopInfo.setShopState(state);
            // 更新店铺状态，返回操作结果
            return shopInfoService.updateById(shopInfo) ? RestBean.success(shopId) : RestBean.failure(500, "server error");
        }

        return RestBean.failure(403, "state error");
    }

    /**
     * 获取正常营业的店铺总数
     * @return 店铺数量响应
     */
    @RequestMapping("/size")
    public RestBean shopSize() {
        // 查询状态为3（正常营业）的店铺数量
        return RestBean.success(shopInfoService.list(new QueryWrapper<ShopInfo>().eq("shop_state", 3)).size());
    }
    /**
     * 获取当前用户的店铺信息
     * @param request HTTP请求对象，用于获取用户身份
     * @return 店铺信息响应
     */
    @RequestMapping("/info")
    public RestBean getInfo(HttpServletRequest request) {
        // 从JWT中解析用户ID
        String uuid = jwtUtil.getJwtUsername(request);
        // 查询用户作为店主的店铺信息
        ShopInfo shopInfo = shopInfoService.getOne(new QueryWrapper<ShopInfo>().eq("shop_master_id", uuid));
        return shopInfo != null ? RestBean.success(shopInfo) : RestBean.failure(403, "没有开设店铺");
    }

    /**
     * 根据店铺ID查询店铺详情
     * @param id 店铺ID
     * @return 店铺详情响应
     */
    @RequestMapping("/get/{id}")
    public RestBean selectOne(@PathVariable String id) {
        // 根据店铺ID查询店铺信息
        ShopInfo shopInfo = shopInfoService.getById(id);
        return shopInfo == null ? RestBean.failure(403, "没有该记录") : RestBean.success(shopInfo);
    }

    /**
     * 获取店铺经营数据统计（总订单数、总收入、今日订单数、今日收入）
     * @param request HTTP请求对象，用于获取用户身份
     * @return 店铺统计数据响应
     */
    @RequestMapping("/show")
    public RestBean show(HttpServletRequest request) {
        // 从JWT中解析用户ID
        String uuid = jwtUtil.getJwtUsername(request);
        // 查询用户作为店主的店铺信息
        ShopInfo shopMasterId = shopInfoService.getOne(new QueryWrapper<ShopInfo>().eq("shop_master_id", uuid));
        if (shopMasterId == null) return RestBean.failure(403, "信息异常");

        // 创建统计数据对象
        ShopShow show = new ShopShow();

        // 计算店铺总订单数和总收入
        List<OrderInfo> orderInfos = orderInfoService.list(new QueryWrapper<OrderInfo>().eq("shop_id", shopMasterId.getShopId()));
        BigDecimal totalMoney = BigDecimal.valueOf(0);
        int totalOrder = 0;
        for (OrderInfo o : orderInfos) {
            totalMoney = totalMoney.add(o.getMoney());
            totalOrder++;
        }
        show.setMoneyTotal(Double.valueOf(totalMoney.toString()));
        show.setOrderCount(totalOrder);

        // 计算今日订单数和今日收入
        List<OrderInfo> orderInfosToTotal = orderInfoService.list(new QueryWrapper<OrderInfo>()
                .eq("shop_id", shopMasterId.getShopId())
                .apply("DATE(input_time) = DATE(NOW())"));
        BigDecimal todayTotalMoney = BigDecimal.valueOf(0);
        int todayTotalOrder = 0;
        for (OrderInfo o : orderInfosToTotal) {
            todayTotalMoney = todayTotalMoney.add(o.getMoney());
            todayTotalOrder++;
        }
        show.setTodayOrderCount(todayTotalOrder);
        show.setTodayTotalMoney(Double.valueOf(todayTotalMoney.toString()));

        // 返回统计数据
        return RestBean.success(show);
    }

    /**
     * 分页查询学校内的店铺列表
     * @param page 当前页码
     * @param item 每页显示数量
     * @return 学校内店铺列表响应
     */
    @RequestMapping("/query/school/{page}/{item}")
    public RestBean queryBySchool(@PathVariable int page, @PathVariable int item) {
        // 调用服务层方法分页查询学校内的店铺
        return RestBean.success(shopInfoService.queryBySchool(page, item));
    }
}